
def simple_middleware(get_response):
    #定义中间件
    '''
    simple_middleware: 外层函数，主要是在请求阶段执行的
    param：get_response 我们可以理解为视图本身
    '''
    def middleware(request):
        print(request.headers) #用来识别用户身份
        print(request.path) #提取访问网站的那个文件
        print('------视图执行之前------')
        response = get_response(request) #执行的就是视图结果
        print("------视图执行之后--------")
        return response

    return middleware

from django.utils.deprecation import MiddlewareMixin
from django.http.response import HttpResponse
class MyMiddleware(MiddlewareMixin):
    """类中间件"""
    def process_request(self, request):
        #方法名都是固定的，该方法会在用户请求访问路由解析完成之后，调用视图之前执行
        print('1.在路由解析之后，在request对应的视图之前 会自动执行：process_request')
        #用途：权限，路由分发，cdn，用户识别，白名单，黑名单
        #注意，此方法不能使用return，使用则报错

    def process_view(self, request, view_func, view_args, view_kwargs):
        #用途：进行缓存处理，参数识别，根据参数查询缓存是否成立
        print("2.在视图接收参数之后，在视图返回之前 自动执行：process_view")
        #可以返回response对象，如果返回response对象之后，则当前对应的视图函数将不会被执行
        #return HttpResponse("ok")
        #也可以不返回response，则默认返回None,django就会自动执行视图函数

    def process_response(self, request, response):
        print("4.视图执行之后，会自动执行：process_response")
        #用途：记录操作历史，记录访问历史，修改返回给客户端的数据，建立缓存
        #必须要有response对象，否则报错！！！
        return response

    def process_exception(self, request, exception):
        print(exception)
        #用途：记录用户的报错信息
        print("5.视图执行过程中，如果视图出现异常，则会自动执行，process_exception 否则不会执行！")

    def process_template_response(self, request, response):
        #用途：建立页面缓存
        print("6.process_template_response 只有在调用了模板之后，才会被执行")
        return response